// preload.js 中使用nodejs
// 首先引入fs模块
const fs = require('fs');

const validDir = function (path) {
  return new Promise((resolve) => {
    fs.stat(path, (err, stats) => {
      if (err) {
        resolve({
          code: -1,
          errMsg: '文件夹不存在',
        });
      } else {
        if (stats.isDirectory()) {
          resolve({
            code: 1,
            errMsg: '路径为文件夹',
          });
        } else {
          resolve({
            code: -11,
            errMsg: '路径不是文件夹',
          });
        }
      }
    });
  });
};

const getMediaDir = function (path) {
  return new Promise((resolve) => {
    fs.readdir(path, (err, files) => {
      if (err) {
        resolve({
          code: -1,
          errMsg: JSON.stringify(err),
        });
      } else {
        const mediaRegex = /.+\.mp3$/;
        resolve({
          code: 1,
          data: files.filter((fileName) => mediaRegex.test(fileName)),
        });
      }
    });
  });
};

const getMediaFile = function (path) {
  return new Promise((resolve, reject) => {
    if (fs.existsSync(path)) {
      try {
        let ws = fs.createReadStream(path, {
          flags: 'r',
          encoding: null,
          fd: null,
          autoClose: true,
          start: 0,
        });
        let chunks = []; // 创建存放数据块的数组，用以存放读取到的数据块，在后续进行消费
        // 每当流将数据块的所有权移交给消费者时，则会触发 'data' 事件。
        ws.on('data', (chunk) => chunks.push(chunk));
        // 当所有的数据块读完后，触发end事件
        ws.on('end', () => {
          // 在这里处理读取到的媒体流
          // 将收集到的数据块进行base64处理
          // 这就是媒体的数据，将其放至在audio/video标签的src属性即可播放
          let bs = Buffer.concat(chunks).toString('base64');
          let src = 'data:audio/mp3;base64,' + bs;
          resolve({
            code: 1,
            data: src,
          });
        });
      } catch (err) {
        resolve({
          code: -1,
          errMsg: JSON.stringify(err),
        });
      }
    } else {
      resolve({
        code: -1,
        errMsg: '音乐文件不存在',
      });
    }
  });
};

const getLrcFile = function (path = '/Users/mac/Desktop/V_mp3/陈壹千-一个.lrc') {
  return new Promise((resolve) => {
    let existsPath = '';
    // 读取LRC文件内容
    if (fs.existsSync(path.replace(/\.\S+$/, '.txt'))) {
      existsPath = path.replace(/\.\S+$/, '.txt');
    } else if (fs.existsSync(path.replace(/\.\S+$/, '.lrc'))) {
      existsPath = path.replace(/\.\S+$/, '.lrc');
    } else {
      resolve({
        code: -1,
        errMsg: '如需加载歌词,请配置歌词所在目录,要求音乐文件同名的UTF8编码的lrc或txt文件',
      });
      return;
    }
    fs.readFile(existsPath, 'utf8', (err, data) => {
      if (err) {
        resolve({
          code: -1,
          errMsg: JSON.stringify(err),
        });
        return;
      }
      resolve({
        code: 1,
        data: data,
      });
    });
  });
};

window.utoolsPreload = {
  getMediaFile,
  getLrcFile,
  getMediaDir,
  validDir
};
